/* eslint react/no-multi-comp:0, no-console:0 */

import { createForm } from '../index';
import { regionStyle, errorStyle } from './styles';

const CustomInput = {
  props: {
    form: Object,
  },
  data() {
    return {
      data: [],
    };
  },
  methods: {
    checkUpper(rule, value = '', callback) {
      if (value !== value.toUpperCase()) {
        callback(new Error('need to be upper!'));
      } else {
        callback();
      }
    },
    toUpper(v, prev) {
      if (v === prev) {
        return v;
      }
      return v.toUpperCase();
    },
  },

  render() {
    const { getFieldProps, getFieldError } = this.form;
    const errors = getFieldError('upper');
    return (
      <div style={regionStyle}>
        <div>upper normalize</div>
        <div>
          <input
            {...getFieldProps('upper', {
              normalize: this.toUpper,
              rules: [
                {
                  validator: this.checkUpper,
                },
              ],
            })}
          />
        </div>
        <div style={errorStyle}>{errors ? errors.join(',') : null}</div>
      </div>
    );
  },
};

const MaxMin = {
  props: {
    form: Object,
  },
  methods: {
    normalizeMin(value, prevValue, allValues) {
      console.log('normalizeMin', allValues.min, allValues.max);
      const previousAllValues = this.form.getFieldsValue();
      if (allValues.max !== previousAllValues.max) {
        // max changed
        if (value === '' || Number(allValues.max) < Number(value)) {
          return allValues.max;
        }
      }
      return value;
    },
    normalizeMax(value, prevValue, allValues) {
      console.log('normalizeMax', allValues.min, allValues.max);
      const previousAllValues = this.form.getFieldsValue();
      if (allValues.min !== previousAllValues.min) {
        // min changed
        if (value === '' || Number(allValues.min) > Number(value)) {
          return allValues.min;
        }
      }
      return value;
    },
  },

  render() {
    const { getFieldProps } = this.form;
    return (
      <div style={regionStyle}>
        <div>
          min:{' '}
          <select
            {...getFieldProps('min', {
              normalize: this.normalizeMin,
              initialValue: '',
            })}
          >
            <option value="">empty</option>
            <option value="1">1</option>
            <option value="2">2</option>
            <option value="3">3</option>
            <option value="4">4</option>
            <option value="5">5</option>
          </select>
        </div>
        <div>
          max:{' '}
          <select
            {...getFieldProps('max', {
              initialValue: '',
              normalize: this.normalizeMax,
            })}
          >
            <option value="">empty</option>
            <option value="1">1</option>
            <option value="2">2</option>
            <option value="3">3</option>
            <option value="4">4</option>
            <option value="5">5</option>
          </select>
        </div>
      </div>
    );
  },
};

const Form = {
  // props: {
  //   form: Object,
  // },
  methods: {
    onSubmit(e) {
      e.preventDefault();
      this.form.validateFields((error, values) => {
        if (!error) {
          console.log('ok', values);
        } else {
          console.log('error', error, values);
        }
      });
    },
  },

  render() {
    const { form } = this;
    return (
      <div style={{ margin: '20px' }}>
        <h2>normalize</h2>
        <form onSubmit={this.onSubmit}>
          <CustomInput form={form} />

          <MaxMin form={form} />

          <div style={regionStyle}>
            <button>submit</button>
          </div>
        </form>
      </div>
    );
  },
};

export default createForm()(Form);
